<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>let var const</title>
</head>
<body>
<script>

//ES5 js本身有很多缺陷 ===> ES6--ES10

// let const 语法和 var一样都是用来声明变量的
    // 1.是否存在变量提升？ var声明的变量存在变量提升 let/const声明的变量不存在
    // 2.是否存在暂时性死区？ var声明的变量不存在 let/const声明的变量存在
// 在变量声明之前,任何的地方都不能去提前使用,一旦使用就会报错,那么这之前的这些代码,对于这个变量来说就是暂时性死区
    // 3.是否允许重复声明变量？ var声明的变量可以重复声明 let/const声明的变量不可以重复声明
    // 4.是否存在块级作用域？var声明的变量不存在块级作用域 let/const声明的变量存在块级作用域
    // 5.是否能修改声明的变量？const声明的是一个常量,const声明的变量必须要进行初始化 不能够重新赋值 var和let可以重新赋值


//变量提升 在未定义之前可以使用而且不报错 (
//预解释 预解析 在浏览器拿到js代码将要执行之前,会整体的解读一遍js文件,把其中的var声明的变量还有function提前定义

/*// console.log(a); //undefined 在没有定义之前使用a代码不报错 值为undefined
var a = 100;  //使用var声明的变量存在变量提升
function fn(){

}


let a = 100;  //Cannot access 'a' before initialization  不能在a未定义之前使用
let b
console.log(b);//undefined*/


// 是否允许重复声明变量
// var a = 10;
// var a = 12;

// let a = 10;
// let a = 12; //Identifier 'a' has already been declared ==> a这个变量已经被创建(定义过了)



//块级作用域  ES6新增作用域 块级作用域 一个{ }表示一个块级作用域
/*var a = 2;
for (var a = 0;a<10;a++){

}
console.log(a); //10*/

/*var a = 2;
for (let a = 0;a<10;a++){

}
console.log(a); //2*/
// js中的作用域 全局作用域  函数作用域  块级作用域(ES6新增)
//作用域链 在局部作用域(函数作用域/块级作用域)中访问一个变量,如果这个作用域不存在这个变量,那么根据作用域链查找的原则,会一层层向上查找,知道找到最顶层作用域(全局作用于)为止,如果还找不到 就会报错 xxx is not defined

//闭包 函数内部嵌套另一个函数, 这个函数被当作返回值返回,当最外层的函数执行的时候,由于内部函数使用了外部函数中定义的属性或变量, 此时,外部函数执行完毕之后并不会销毁,而是被内部函数所引用,此时如果直接执行内部函数,那么可以读取到外部函数中定义的变量, 这种情况就叫做闭包
/*function fn(){
    let a = 100;
    return function (){
        console.log(a)
    }
}
let fnn = fn();
fnn()*/


/*let a = 200
function fn(){
    console.log(a)//Cannot access 'a' before initialization  不能在a未定义之前使用
    let a = 100;
}
fn();*/

//是否能修改声明的变量  let const
/*var a = 1;
a=2;

let b = 1;
b = 100;

const c = 1;
// c =100; //Assignment to constant variable.  //const声明的是一个常量 不能够重新赋值*/


/*var a;
let b;
const c; //Missing initializer in const declaration //const声明的变量必须要进行初始化*/

//const声明的变量 如果赋值为一个引用数据类型的值,那么是可以修改值里面的内容的,只要不去修改这个变量所指向的内存空间地址即可
//基本数据类型和引用数据类型的区别
const c = {
    n : 1
};
c.n = 100

//const应用
const PI = 3.1415926;
const API = "http://www.baidu.com";


//思考题:

for(var i=0;i<10;i++){
    setTimeout(function(){
        console.log(i)
    },1000)
}


</script>
</body>
</html>